home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 July / Macworld (1999-07).dmg / Shareware World / Comms & Internet / HTML and CSS modes / HTML and CSS Modes / htmlMenu.tcl < prev    next >
Text File  |  1999-04-24  |  25KB  |  744 lines

  1. ## -*-Tcl-*-
  2.  # ###################################################################
  3.  #  HTML mode - tools for editing HTML documents
  4.  # 
  5.  #  FILE: "htmlMenu.tcl"
  6.  #                                    created: 96-04-29 21.31.40 
  7.  #                                last update: 99-04-24 13.17.44 
  8.  #  Author: Johan Linde
  9.  #  E-mail: <jlinde@telia.com>
  10.  #     www: <http://www.theophys.kth.se/~jl/Alpha.html>
  11.  #  
  12.  # Version: 2.1.4
  13.  # 
  14.  # Copyright 1996-1999 by Johan Linde
  15.  #  
  16.  # This software may be used freely, and distributed freely, as long as the 
  17.  # receiver is not obligated in any way by receiving it.
  18.  #  
  19.  # If you make improvements to this file, please share them!
  20.  # 
  21.  # ###################################################################
  22.  ##
  23.  
  24. proc htmlMenu.tcl {} {}
  25.  
  26. proc htmlMarkExtUtil {} {
  27.     global htmlUtilsMenu htmlElemKeyBinding htmlAdditionExist htmlShownWarning
  28.     enableMenuItem $htmlUtilsMenu Extend [expr ![info exists htmlShownWarning]]
  29.     htmlEnableExtend [info exists htmlElemKeyBinding] $htmlAdditionExist
  30. }
  31.  
  32. proc htmlHide {} {
  33.     htmlDisableSome on
  34.     htmlSetDis
  35.     htmlDisableSome off
  36. }
  37.  
  38. # Disable some HTML elements    
  39. proc htmlDisableSome {onoff} {
  40.     global htmlElemKeyBinding htmlDisabledItems htmlMenu
  41.     foreach i $htmlDisabledItems {
  42.         set it [split $i /]
  43.         enableMenuItem [lindex $it 0] [lindex $it 1] $onoff
  44.     }
  45. }
  46.  
  47. proc htmlUseBigBrother {} {
  48.     global HTMLmodeVars modifiedModeVars
  49.     set HTMLmodeVars(useBigBrother) [expr !$HTMLmodeVars(useBigBrother)]
  50.     if {[catch {nameFromAppl Bbth}]} {
  51.         set HTMLmodeVars(useBigBrother) 0
  52.         enableMenuItem {Check Links} {Use Big Brother} off
  53.     }
  54.     markMenuItem -m {Check Links} {Use Big Brother} $HTMLmodeVars(useBigBrother) 
  55.     lappend modifiedModeVars {useBigBrother HTMLmodeVars}
  56.     message "[lindex {"Don't use" Use} [set HTMLmodeVars(useBigBrother)]] Big Brother."
  57. }
  58.  
  59. # Called from HTML menu to change browser.
  60. proc htmlToggleBrowser {brws} {
  61.     global htmlBrowsers browserSig modifiedVars
  62.     foreach b $htmlBrowsers {
  63.         if {$brws == [lindex $b 1]} {set browserSig [lindex $b 0]}
  64.     }
  65.     lappend modifiedVars browserSig
  66.     if {![key::optionPressed]} {htmlSendWindow}
  67. }
  68.  
  69. # Called whenever browserSig is changed.
  70. proc htmlToggleBrowser2 {args} {
  71.     global browserSig htmlBrowsers HTMLmodeVars
  72.     if {[lsearch -exact $HTMLmodeVars(browsers) $browserSig] < 0} {htmlAddBrowser $browserSig}
  73.     foreach b $htmlBrowsers {
  74.         if {$browserSig == [lindex $b 0]} {
  75.             markMenuItem -m Browsers [lindex $b 1] on 
  76.         } else {
  77.             markMenuItem -m Browsers [lindex $b 1] off
  78.         }
  79.     }
  80. }
  81.  
  82. # Add a browser to Browser menu.
  83. proc htmlAddBrowser {{sig ""}} {
  84.     global htmlBrowsers HTMLmodeVars modifiedModeVars browserSig
  85.     if {$sig == ""} {
  86.         set fil [getfile "Locate a web browser."]
  87.         set sig [getFileSig $fil]
  88.     }
  89.     if {[catch {nameFromAppl $sig} fil]} {
  90.         alertnote "Couldn't get the name of the browser. If nothing else helps try rebuilding the desktop."
  91.         return
  92.     }
  93.     if {[lsearch -exact $HTMLmodeVars(browsers) $sig] >= 0} {return}
  94.     lappend HTMLmodeVars(browsers) $sig
  95.     lappend modifiedModeVars {browsers HTMLmodeVars}
  96.     lappend htmlBrowsers [list $sig [set app [file tail $fil]]]
  97.     htmlAddBrowserItem $app $sig
  98.     if {$sig == $browserSig} {markMenuItem -m "Browsers" $app on }
  99.     message "$app added to Browsers menu."
  100. }
  101.  
  102. # Remove a browser from Browser menu.
  103. proc htmlRemoveBrowser {} {
  104.     global htmlBrowsers HTMLmodeVars modifiedModeVars browserSig modifiedVars
  105.     foreach b $htmlBrowsers {
  106.         lappend tmp [lindex $b 1]
  107.     }
  108.     if {[catch {listpick -p "Select browser to remove" $tmp} brws] || $brws == ""} {return}
  109.     for {set i 0} {$i < [llength $htmlBrowsers]} {incr i} {
  110.         if {$brws == [lindex [lindex $htmlBrowsers $i] 1]} {
  111.             deleteMenuItem -m Browsers $brws
  112.             if {[lindex $HTMLmodeVars(browsers) $i] == $browserSig} {
  113.                 set j 0
  114.                 if {$i == 0} {incr j}
  115.                 if {$j < [llength $HTMLmodeVars(browsers)]} {set browserSig [lindex $HTMLmodeVars(browsers) $j]}
  116.                 lappend modifiedVars browserSig
  117.             }
  118.             set htmlBrowsers [lreplace $htmlBrowsers $i $i]
  119.             set HTMLmodeVars(browsers) [lreplace $HTMLmodeVars(browsers) $i $i] 
  120.         }
  121.     }
  122.     lappend modifiedModeVars {browsers HTMLmodeVars}
  123.     message "$brws removed from Browsers menu."
  124. }
  125.  
  126. proc htmlAddBrowserItem {app sig} {
  127.     global alpha::version
  128.     switch $sig {
  129.         MOSS {
  130.             if {[string match "*Navigator*" $app]} {
  131.                 set ic 85
  132.             } else {
  133.                 set ic 86
  134.             }
  135.         }
  136.         MSIE {set ic 87}
  137.         OlG1 {set ic 88}
  138.         dogz {set ic 73}
  139.         iCAB {
  140.             if {[alpha::package vsatisfies ${alpha::version} 7.2fc11]} {
  141.                 set ic 89
  142.             } else {
  143.                 set ic 78
  144.             }
  145.         }
  146.         default {set ic 78}
  147.     }
  148.     addMenuItem -m Browsers [menu::itemWithIcon $app $ic]
  149. }
  150.  
  151. proc htmlEnableURLs {onoff} {
  152.     enableMenuItem URLs "Clean Up…" $onoff
  153.     enableMenuItem URLs "Clear" $onoff
  154.     enableMenuItem URLs "Export…" $onoff
  155. }
  156.  
  157. proc htmlEnablewindows {onoff} {
  158.     global htmlUtilsMenu
  159.     enableMenuItem $htmlUtilsMenu Windows $onoff
  160. }
  161.  
  162. proc htmlEnableExtend {a b} {
  163.     enableMenuItem Extend "Change Key Binding…" $a
  164.     enableMenuItem Extend "Change Type and Layout…" $a
  165.     enableMenuItem Extend "Remove Attributes…" $b
  166.     enableMenuItem Extend "Remove Additions…" $b
  167. }
  168.  
  169. proc htmlActivateHook {args} {
  170.     global htmlHideDeprecated htmlHideExtensions htmlHideFrames
  171.     set htmlHideExtensions 0
  172.     set htmlHideDeprecated 0
  173.     set htmlHideFrames 0
  174.     set doc [htmlFindDoctype]
  175.     if {$doc == "transitional" || $doc == "frameset"} {
  176.         set htmlHideExtensions 1
  177.         if {$doc == "transitional"} {set htmlHideFrames 1}
  178.     } elseif {$doc == "strict"} {
  179.         set htmlHideDeprecated 1
  180.     }
  181.     htmlHide
  182. }
  183.  
  184. proc htmlFindDoctype {} {
  185.     if {![catch {search -s -f 1 -r 1 -i 1 -m 0 {<!doctype[^<>]+html[ \t\r\n]+4.0[ \t\r\n]+transitional[^<>]+>} 0}]} {
  186.         return transitional
  187.     } elseif {![catch {search -s -f 1 -r 1 -i 1 -m 0 {<!doctype[^<>]+html[ \t\r\n]+4.0[ \t\r\n]+frameset[^<>]+>} 0}]} {
  188.         return frameset
  189.     } elseif {![catch {search -s -f 1 -r 1 -i 1 -m 0 {<!doctype[^<>]+html[ \t\r\n]+4.0[ \t\r\n]*//[^<>]+>} 0}]} {
  190.         return strict
  191.     }
  192.     return ""
  193. }
  194.  
  195. #===============================================================================
  196. # Menu Processing
  197. #===============================================================================
  198.  
  199. proc htmlMenuItem {menu item} {
  200.     global htmlElemProc htmlDisabledItems
  201.     global screenWidth defWidth
  202.  
  203.     foreach it $htmlDisabledItems {
  204.         if {[lindex [split $it /] 1] == $menu || "${menu}/$item" == $it} {beep; return}
  205.     }
  206.     
  207.     switch -glob $menu {
  208.         "•*" {eval html[join $item ""]}
  209.         "Browsers" {
  210.             switch $item {
  211.                 "Send File to Browser"    {htmlSendWindow}
  212.                 "Add"    {htmlAddBrowser}
  213.                 "Remove" {htmlRemoveBrowser}
  214.                 default {htmlToggleBrowser $item}
  215.             }
  216.         }
  217.         "Preferences" {HTMLmodifyFlags [lindex $item 0]}
  218.         "Palettes" {float -m "$item" -t 50 -l [expr $screenWidth - $defWidth > 110 ? $defWidth : $screenWidth - 110] -z HTML} 
  219.         "Editing" {eval html[join $item ""]}
  220.         "Validate" {eval html[join $item ""]}
  221.         "Character Translation"    {
  222.             switch $item {
  223.                 "åäö -> HTML"        {htmlCharacterstohtml 0}
  224.                 "HTML -> åäö"    {htmltoCharacters 0}
  225.                 "<>& -> HTML"    {htmlCharacterstohtml 1}
  226.                 "HTML -> <>&"    {htmltoCharacters 1}
  227.                 default {eval html[join $item ""]}
  228.             }
  229.         }
  230.         "URLs"    {
  231.             switch $item {
  232.                 "Clean Up"        {htmlCleanUpCache URLs}
  233.                 "Clear"            {htmlClearCache URLs}
  234.                 default {eval html[join $item ""]}
  235.             }
  236.         }
  237.         "Windows"    {
  238.             switch $item {
  239.                 "Clean Up"    {htmlCleanUpCache windows}
  240.                 "Clear"        {htmlClearCache windows}
  241.                 default {eval html[join $item ""]}
  242.             }
  243.         }
  244.         "Check Links" {eval html[join $item ""]}
  245.         "Includes" {eval html[join $item ""]}
  246.         "Home Page Windows" {
  247.             switch $item {
  248.                 "Open" {htmlOpenHPwin}
  249.                 default {eval html[join $item ""]}
  250.             }
  251.         }
  252.         "Extend" {eval html[join $item ""]}
  253.         "Style Sheets" {
  254.             switch $item {
  255.                 Style {htmlTag {htmlBuildCR2Elem STYLE}}
  256.                 Span {htmlTag {htmlBuildElem SPAN}}
  257.                 Import {cssDialog @import}
  258.                 Display {cssDialog Display}
  259.                 default {
  260.                     if {[info commands html[join $item ""]] != ""} {
  261.                         eval html[join $item ""]
  262.                     } else {
  263.                         cssDialog [join [string tolower $item] -]}
  264.                     }
  265.             }
  266.         }
  267.         "Headers" {
  268.             switch $item {
  269.                 "Header1"    {htmlTag {htmlBuildCRElem H1 1}}
  270.                 "H1 no attr" {htmlTag {htmlBuildCRElem H1 1 NOATTR}}
  271.                 "Header2"    {htmlTag {htmlBuildCRElem H2 1}}
  272.                 "H2 no attr" {htmlTag {htmlBuildCRElem H2 1 NOATTR}}
  273.                 "Header3"    {htmlTag {htmlBuildCRElem H3 1}}
  274.                 "H3 no attr" {htmlTag {htmlBuildCRElem H3 1 NOATTR}}
  275.                 "Header4"    {htmlTag {htmlBuildCRElem H4 1}}
  276.                 "H4 no attr" {htmlTag {htmlBuildCRElem H4 1 NOATTR}}
  277.                 "Header5"    {htmlTag {htmlBuildCRElem H5 1}}
  278.                 "H5 no attr" {htmlTag {htmlBuildCRElem H5 1 NOATTR}}
  279.                 "Header6"    {htmlTag {htmlBuildCRElem H6 1}}
  280.                 "H6 no attr" {htmlTag {htmlBuildCRElem H6 1 NOATTR}}
  281.                 default {eval html[join $item ""]}
  282.             }
  283.         }
  284.         "Blocks and Dividers" {
  285.             switch $item {
  286.                 "Paragraph"    {htmlElemParagraph}
  287.                 "P no attr" {htmlElemParagraph NOATTR}
  288.                 "Division"        {htmlTag {htmlBuildCR2Elem DIV}}
  289.                 "Block Quote"    {htmlTag {htmlBuildCR2Elem BLOCKQUOTE}}
  290.                 "Address"        {htmlTag {htmlBuildCRElem ADDRESS}}
  291.                 "Center"        {htmlTag {htmlBuildCR2Elem CENTER}}
  292.                 "Preformatted"    {htmlTag {htmlBuildCR2Elem PRE}}
  293.                 "Multi Column"    {htmlTag {htmlBuildCR2Elem MULTICOL}}
  294.                 "Spacing"        {htmlTag {htmlBuildOpening SPACER}}
  295.                 "Direction Override" {htmlTag {htmlBuildCRElem BDO}}
  296.                 "Inserted Text"    {htmlTag {htmlBuildCRElem INS}}
  297.                 "Deleted Text"    {htmlTag {htmlBuildCRElem DEL}}
  298.                 "Line Break"        {htmlTag {htmlBuildOpening BR 0 1}}
  299.                 "BR no attr"        {htmlTag {htmlBuildOpening BR 0 1 NOATTR}}
  300.                 "Horizontal Rule"    {htmlTag {htmlBuildOpening HR 1 1}}
  301.                 "HR no attr"    {htmlTag {htmlBuildOpening HR 1 1 NOATTR}}
  302.                 "No Line Break"    {htmlTag {htmlBuildElem NOBR}}
  303.                 "Word Break"    {htmlTag {htmlBuildOpening WBR 0 1}}
  304.                 default {eval html[join $item ""]}
  305.             }
  306.         }
  307.         "Styles"    {
  308.             switch $item {
  309.                 "Font"            {htmlTag {htmlBuildElem FONT}}
  310.                 "Basefont"        {htmlTag {htmlBuildOpening BASEFONT 1 1}}
  311.                 "Marquee"        {htmlTag {htmlBuildCRElem MARQUEE}}
  312.                 "Bold"            {htmlTag {htmlBuildElem B}}
  313.                 "Italic"        {htmlTag {htmlBuildElem I}}
  314.                 "Strike out"    {htmlTag {htmlBuildElem STRIKE}}
  315.                 "Underlined"    {htmlTag {htmlBuildElem U}}
  316.                 "Subscript"        {htmlTag {htmlBuildElem SUB}}
  317.                 "Superscript"    {htmlTag {htmlBuildElem SUP}}
  318.                 "Bigger"        {htmlTag {htmlBuildElem BIG}}
  319.                 "Smaller"        {htmlTag {htmlBuildElem SMALL}}
  320.                 "Emphasis"        {htmlTag {htmlBuildElem EM}}
  321.                 "Strong"        {htmlTag {htmlBuildElem STRONG}}
  322.                 "Definition"    {htmlTag {htmlBuildElem DFN}}
  323.                 "Code"            {htmlTag {htmlBuildElem CODE}}
  324.                 "Variable"        {htmlTag {htmlBuildElem VAR}}
  325.                 "Citation"        {htmlTag {htmlBuildElem CITE}}
  326.                 "Keyboard"        {htmlTag {htmlBuildElem KBD}}
  327.                 "Typewriter"    {htmlTag {htmlBuildElem TT}}
  328.                 "Sample"        {htmlTag {htmlBuildElem SAMP}}
  329.                 "Blinking"        {htmlTag {htmlBuildElem BLINK}}
  330.                 "Quotation"        {htmlTag {htmlBuildElem Q}}
  331.                 "Abbreviation"    {htmlTag {htmlBuildElem ABBR}}
  332.                 "Acronym"        {htmlTag {htmlBuildElem ACRONYM}}
  333.                 default {eval html[join $item ""]}
  334.             }
  335.         }
  336.         "Links"    {
  337.             switch $item {
  338.                 "Link or Anchor" {htmlTag {htmlBuildElem A}}
  339.                 "Image"    {htmlTag {htmlBuildOpening IMG}}
  340.                 Object {htmlTag {htmlBuildCR2Elem OBJECT}}
  341.                 Sound {htmlTag {htmlBuildOpening BGSOUND 1 1}}
  342.                 default {eval html[join $item ""]}
  343.             }
  344.         }
  345.         "Plug-ins" {
  346.             switch $item {
  347.                 "General" {htmlTag {htmlBuildOpening EMBED}}
  348.                 "LiveAudio" {htmlTag {htmlBuildOpening EMBED 0 0 LIVEAUDIO}}
  349.                 "LiveVideo" {htmlTag {htmlBuildOpening EMBED 0 0 LIVEVIDEO}}
  350.                 "QuickTime Movie" {htmlTag {htmlBuildOpening EMBED 0 0 "QUICKTIME MOVIE"}}
  351.                 "QuickTime VR" {htmlTag {htmlBuildOpening EMBED 0 0 "QUICKTIME VR"}}
  352.                 "RealAudio"    {htmlTag {htmlBuildOpening EMBED 0 0 REALAUDIO}}
  353.                 "No Embed" {htmlTag {htmlBuildCR2Elem NOEMBED}}
  354.                 default {eval html[join $item ""]}
  355.             }
  356.         }
  357.         "Lists"    {
  358.             switch $item {
  359.                 "Bulleted"    {htmlTag {htmlBuildList UL "LI IN UL" UL}}
  360.                 "UL no attr"    {htmlTag {htmlBuildList UL NOATTR NOATTR}}
  361.                 "New Bulleted Item" {htmlTag {htmlBuildListEntry "LI IN UL"}}
  362.                 "Numbered"    {htmlTag {htmlBuildList OL "LI IN OL" OL}}
  363.                 "OL no attr"    {htmlTag {htmlBuildList OL NOATTR NOATTR}}
  364.                 "New Numbered Item" {htmlTag {htmlBuildListEntry "LI IN OL"}}
  365.                 "Directory"    {htmlTag {htmlBuildList DIR LI}}
  366.                 "Menu"        {htmlTag {htmlBuildList MENU LI}}
  367.                 "New List Item"    {htmlTag {htmlBuildListEntry LI}}
  368.                 "Discursive"    {htmlTag {htmlBuildList DL}}
  369.                 default {eval html[join $item ""]}
  370.             }
  371.         }
  372.         "Forms" {
  373.             switch $item {
  374.                 "Form"        {htmlTag {htmlBuildCR2Elem FORM}}
  375.                 "Field Set" {htmlTag {htmlBuildCR2Elem FIELDSET}}
  376.                 "Legend"    {htmlTag {htmlBuildCRElem LEGEND}}
  377.                 "Label"        {htmlTag {htmlBuildElem LABEL}}
  378.                 "Text"        {htmlTag {htmlBuildInputElem TEXT}}
  379.                 "Checkbox"    {htmlTag {htmlBuildInputElem CHECKBOX}}
  380.                 "Input Button"    {htmlTag {htmlBuildInputElem BUTTON}}
  381.                 "Radio"        {htmlTag {htmlBuildInputElem RADIO}}
  382.                 "Submit"        {htmlTag {htmlBuildInputElem SUBMIT}}
  383.                 "Reset"        {htmlTag {htmlBuildInputElem RESET}}
  384.                 "Password"    {htmlTag {htmlBuildInputElem PASSWORD}}
  385.                 "Hidden"        {htmlTag {htmlBuildInputElem HIDDEN}}
  386.                 "Image"        {htmlTag {htmlBuildInputElem IMAGE}}
  387.                 "File Upload" {htmlTag {htmlBuildInputElem FILE}}
  388.                 "Button"    {htmlTag {htmlBuildCRElem BUTTON}}
  389.                 "Select"        {htmlTag {htmlBuildCR2Elem SELECT}}
  390.                 "Option Group" {htmlTag {htmlBuildCR2Elem OPTGROUP}}
  391.                 "Option"        {htmlTag {htmlBuildOpening OPTION 1}}
  392.                 "Textarea"    {htmlTag {htmlBuildCRElem TEXTAREA}}
  393.                 "Key Generator" {htmlTag {htmlBuildOpening KEYGEN 1 1}}
  394.                 default {eval html[join $item ""]}
  395.             }
  396.         }
  397.         "Tables" {
  398.             switch $item {
  399.                 Table    {htmlTag {htmlBuildCR2Elem TABLE}}
  400.                 Row        {htmlTag {htmlBuildCR2Elem TR}}
  401.                 "TR no attr"        {htmlTag {htmlBuildCR2Elem TR NOATTR}}
  402.                 Header        {htmlTag {htmlBuildElem TH}}
  403.                 "TH no attr"        {htmlTag {htmlBuildElem TH NOATTR}}
  404.                 Cell        {htmlTag {htmlBuildElem TD}}
  405.                 "TD no attr"        {htmlTag {htmlBuildElem TD NOATTR}}
  406.                 Caption    {htmlTag {htmlBuildCRElem CAPTION}}
  407.                 Head {htmlTag {htmlBuildOpening THEAD 1 1}}
  408.                 Body {htmlTag {htmlBuildOpening TBODY 1 1}}
  409.                 Foot {htmlTag {htmlBuildOpening TFOOT 1 1}}
  410.                 "Column Group" {htmlTag {htmlBuildOpening COLGROUP 1 1}}
  411.                 Column {htmlTag {htmlBuildOpening COL 1 1}}
  412.                 default {eval html[join $item ""]}
  413.             }
  414.         }
  415.         "Frames" {
  416.             switch $item {
  417.                 Frameset        {htmlTag {htmlBuildCR2Elem FRAMESET}}
  418.                 Frame        {htmlTag {htmlBuildOpening FRAME 1 1}}
  419.                 "Inline Frame" {htmlTag {htmlBuildElem IFRAME}}
  420.                 "No Frames"    {htmlTag {htmlBuildCR2Elem NOFRAMES}}
  421.                 default {eval html[join $item ""]}
  422.             }
  423.         }
  424.         "Image Maps" {
  425.             switch $item {
  426.                 Map        {htmlTag {htmlBuildCR2Elem MAP}}
  427.                 Area    {htmlTag {htmlBuildOpening AREA 1 1}}
  428.                 default {eval html[join $item ""]}
  429.             }
  430.         }
  431.         "Java and JavaScript"    {
  432.             switch $item {
  433.                 Applet    {htmlTag {htmlBuildCR2Elem APPLET}}
  434.                 Parameter {htmlTag {htmlBuildOpening PARAM 1 1}}
  435.                 Script    {htmlTag {htmlBuildCR2Elem SCRIPT}}
  436.                 "No Script" {htmlTag {htmlBuildCR2Elem NOSCRIPT}}
  437.                 Server {htmlTag {htmlBuildCR2Elem SERVER}}
  438.                 default {eval html[join $item ""]}
  439.             }
  440.         }
  441.         "Layers" {
  442.             switch $item {
  443.                 Layer {htmlTag {htmlBuildCR2Elem LAYER}}
  444.                 "Inline Layer" {htmlTag {htmlBuildCRElem ILAYER}}
  445.                 "No Layer" {htmlTag {htmlBuildCR2Elem NOLAYER}}
  446.                 default {eval html[join $item ""]}
  447.             }
  448.         }
  449.         "Other"    {
  450.             switch $item {
  451.                 "Base"    {htmlTag {htmlBuildOpening BASE 1 1}}
  452.                 "Isindex" {htmlTag {htmlBuildOpening ISINDEX 1 1}}
  453.                 "Link"    {htmlTag {htmlBuildOpening LINK 1 1}}
  454.                 "Meta"    {htmlTag {htmlBuildOpening META 1 1}}
  455.                 default {eval html[join $item ""]}
  456.             }
  457.         }
  458.         "Character Entities"    {
  459.             switch $item {
  460.                 "Add"    {htmlAddCommonChars}
  461.                 "Default" {htmlDefaultCommonChars}
  462.                 "Clear"    {htmlClearCommonChars}
  463.                 default        {htmlInsertCharacter $item}
  464.             }
  465.         }
  466.         "*Chars*" {
  467.             htmlInsertCharacter $item
  468.         }
  469.         "Custom"    {
  470.             htmlTag $htmlElemProc([string toupper $item])
  471.         }
  472.     }
  473. }
  474.  
  475.  
  476. # Variables defining the sub menus. More variables in hctsmslMenu.tcl
  477.  
  478. set htmlHTMLSub {{"<I/t" "Help"} {"<B/m" "Use Attributes…"} {"<U<O/N" "New Document…"}}
  479.  
  480. set htmlBrowsersSub {{"<U<O/S" "Send File to Browser"} "(-" {"" "Add…"} {"" "Remove…"} "(-"}
  481.  
  482. set htmlPreferencesSub {{"" "General…"} {"" "Attributes…"} {"" "Indentation…"} {"" "JavaScript and CSS…"}
  483.     {"" "Checking Links…"} {"" "Word Wrapping…"}}
  484.     
  485. set htmlUtilitiesSub {{"" "Colors…"} {"" "Home Pages…"} {"" "Footers…"} {"" "Key Bindings…"}
  486.     {"<O/I" "Reformat Paragraph/Reformat Document"} {"" "Save to FTP Server/Forget Passwords"} 
  487.     {"" "Move Files…"} {"" "Last Modified…"} {"" "Document Type…"} {"" "Document Size"} 
  488.     {"" "Document Index…"}}
  489.  
  490. set htmlEditingSub {{"<O/B" "Select Container/Select Opening"}
  491.     {"<U<O/B" "Select in Container"}
  492.     {"<B/e" "Untag/Untag and Select"} {"<B/f" "Remove Opening"}
  493.     {"<B/g" "Change Container…/Change Opening…"} {"<B/h" "Change Choice"}
  494.     {"<B/i" "Reveal Color"} {"<B/j" "Insert Attributes"} {"" "Quote All Attributes"}
  495.     {"" "Tags to Uppercase/Tags to Lowercase"} {"" "Remove Tags"}}
  496.  
  497. set htmlValidateSub {{"" "Find Unbalanced Tags"} {"" "Check Tags"}}
  498.  
  499. set htmlCharacterSub {{"" "åäö -> HTML"} {"" "HTML -> åäö"}}
  500.  
  501. set htmlURLsSub {{"" "Clean Up…"} {"" "Clear"} {"" "Import…"} {"" "Export…"} {"" "Add Folder…"}
  502.     {"" "Add Selection"} {"" "Add Clipboard"}}
  503.  
  504. set htmlWindowsSub {{"" "Clean Up…"} {"" "Clear"}}
  505.  
  506. set htmlCheckSub {{"" "Check Window"} {"" "Check Home Page…"} {"" "Check Folder…"} {"" "Check File…"}
  507.     {"" "Check Remote Links"} "(-" {"" "Use Big Brother"}}
  508.  
  509. set htmlIncludesSub {{"" "Insert Include Tags…"} "(-" {"" "Update Window"} {"" "Update Home Page…"}
  510.     {"" "Update Folder…"} {"" "Update File…"}}
  511.  
  512. set htmlHomeSub {{"" Open…} {"<U<O/V" "Paste URL/Paste Include Tags"} {"" "Refresh Windows"}}
  513.  
  514. set htmlExtendSub {{"" "New Element…"} {"" "New Attributes…"} {"" "New Choices…"} {"" "Change Key Binding…"}
  515.     {"" "Change Type and Layout…"} {"" "Remove Attributes…"} {"" "Remove Additions…"}}
  516.  
  517. set htmlUtilSubMenus {Utilities Editing Validate {Character Translation} URLs Windows
  518. {Check Links} Includes {Home Page Windows} Extend}
  519.  
  520. #
  521. # The menu.
  522. #
  523. # <B = control <I = option <U = shift <O = command <S = dynamic
  524.  
  525. proc htmlBuildMenu {{msg "Building HTML menu…"}} {
  526.     global HTMLmodeVars htmlMenu
  527.     
  528.     html40.tcl
  529.     
  530.     if {[catch {htmlReadCache "HTML menu cache"}]} {
  531.         message $msg
  532.         htmlBuildMenu0
  533.     } else {
  534.         message "Reading HTML menu definition…"
  535.     }
  536.     insertMenu $htmlMenu
  537.  
  538.     htmlBrowsersMenuExtra
  539. }
  540.  
  541. proc htmlBuildMenu0 {} {
  542.     global htmlCustomMenuList modifiedModeVars htmlStartElements
  543.     global htmlMenu HTMLmodeVars htmlSmallCharsMenu
  544.     global htmlCapitalCharsMenu  htmlOtherChars1Menu htmlOtherChars2Menu
  545.     global htmlElemKeyBinding htmlMenuKey
  546.     global htmlSubMenus customHTMLpalettes
  547.     
  548.     set commonChars $HTMLmodeVars(commonChars)
  549.     # Build submenus
  550.     htmlReadMenuKeys
  551.     foreach me $htmlSubMenus {
  552.         set [lindex $me 0]Menu [htmlBuildOneMenu $me]
  553.     }
  554.     
  555.     
  556.     lappend htmlMenuList [list menu -M HTML -p htmlMenuItem -m -n Browsers $BrowsersMenu]
  557.     append htmlMenuList " " [lindex $HTMLMenu 0]
  558.     lappend htmlMenuList [list menu -M HTML -p htmlMenuItem -m -n Preferences $PreferencesMenu]
  559.     # add custom pallettes if any
  560.     if {[info exists customHTMLpalettes]} {
  561.         lappend htmlMenuList [list menu -M HTML -p htmlMenuItem -m -n Palettes $customHTMLpalettes]
  562.     }
  563.     lappend htmlMenuList [lindex $HTMLMenu 1] "(-" [lindex $HTMLMenu 2]
  564.     for {set i $htmlStartElements} {$i < [llength $htmlSubMenus]} {incr i} {
  565.         lappend htmlMenuList [list menu -M HTML -p htmlMenuItem -m -n [lindex $htmlSubMenus $i] [set [lindex [lindex $htmlSubMenus $i] 0]Menu]]
  566.     }
  567.     
  568.     # Allow user to insert custom menu items    
  569.     if {[info exists htmlElemKeyBinding]} {
  570.         foreach elem [lsort [array names htmlElemKeyBinding]] {
  571.             lappend customMenuList "$htmlElemKeyBinding($elem)[string range $elem 0 0][string tolower [string range $elem 1 end]]"
  572.         }
  573.         set htmlCustomMenu [list menu -M HTML -p htmlMenuItem -m -n "Custom" $customMenuList]
  574.         lappend htmlMenuList $htmlCustomMenu
  575.     }
  576.         
  577.     # Character entities
  578.     set htmlSmallCharMenu [list menu -M HTML -p htmlMenuItem -m -n "Small Chars" \
  579.     $htmlSmallCharsMenu]
  580.     set htmlCapCharsMenu [list menu -M HTML -p htmlMenuItem -m -c -n "Capital Chars" \
  581.     $htmlCapitalCharsMenu]
  582.     set htmlSymbCharsMenu1 [list menu -M HTML -p htmlMenuItem -m -n "Other Chars 1" $htmlOtherChars1Menu]
  583.     set htmlSymbCharsMenu2 [list menu -M HTML -p htmlMenuItem -m -n "Other Chars 2" $htmlOtherChars2Menu]
  584.     set tmp $commonChars
  585.     if {[llength $commonChars]} {lappend tmp "(-"}
  586.     lappend tmp Add… Default Clear $htmlSmallCharMenu $htmlCapCharsMenu $htmlSymbCharsMenu1 $htmlSymbCharsMenu2
  587.     set htmlCharsMenu [list menu -M HTML -p htmlMenuItem -m -n "Character Entities" $tmp]
  588.     lappend htmlMenuList $htmlCharsMenu
  589.     
  590.     # Define menu
  591.     menu -M HTML -m  -p htmlMenuItem -n $htmlMenu $htmlMenuList
  592.     
  593.     set h {menu -M HTML -m  -p htmlMenuItem -n $htmlMenu}
  594.     lappend h $htmlMenuList
  595.     htmlSaveCache "HTML menu cache" $h
  596.     catch {unset htmlMenuKey}
  597. }
  598.  
  599.  
  600. proc htmlRebuildMenu {msg} {
  601.     htmlDeleteCache "HTML menu cache"
  602.     htmlBuildMenu $msg
  603. }
  604.  
  605. # Add browsers to Browser menu
  606. proc htmlBrowsersMenuExtra {} {
  607.     global HTMLmodeVars browserSig modifiedModeVars htmlBrowsers
  608.     if {[lsearch -exact $HTMLmodeVars(browsers) $browserSig] < 0} {
  609.         lappend HTMLmodeVars(browsers) $browserSig
  610.         lappend modifiedModeVars {browsers HTMLmodeVars}
  611.     }
  612.     set htmlBrowsers {}
  613.     set tmpbrws {}
  614.     foreach brws $HTMLmodeVars(browsers) {
  615.         if {![catch {nameFromAppl $brws} name]} {
  616.             set name [file tail $name]
  617.             lappend htmlBrowsers [list $brws $name]
  618.             lappend tmpbrws $brws
  619.             htmlAddBrowserItem $name $brws
  620.             if {$brws == $browserSig} {markMenuItem -m "Browsers" $name on }
  621.         } else {
  622.             lappend modifiedModeVars {browsers HTMLmodeVars}
  623.         }
  624.     }
  625.     set HTMLmodeVars(browsers) $tmpbrws
  626. }
  627.  
  628. # Mark and disable some stuff
  629. proc htmlDisMark {} {
  630.     htmlDisableSome off
  631. }
  632.  
  633. proc htmlBuildUtilsMenu {{msg "Building HTML Utilities menu…"}} {
  634.     global htmlUtilsMenu
  635.  
  636.     if {[catch {htmlReadCache "HTML Utilities menu cache"}]} {
  637.         message $msg
  638.         htmlBuildUtilsMenu0
  639.     } else {
  640.         message "Reading HTML Utilities menu definition…"
  641.     }
  642.     insertMenu $htmlUtilsMenu
  643.     
  644.     htmlCharacterMenuExtra
  645.     htmlCheckMenuExtra
  646.     htmlURLsMenuExtra
  647.     htmlWindowsMenuExtra
  648.     htmlUtilDisMark
  649.  
  650. }
  651.  
  652. proc htmlRebuildUtilsMenu {msg} {
  653.     htmlDeleteCache "HTML Utilities menu cache"
  654.     htmlBuildUtilsMenu $msg
  655. }
  656.  
  657. proc htmlBuildUtilsMenu0 {} {
  658.     global htmlUtilSubMenus HTMLmodeVars htmlUtilsMenu htmlMenuKey
  659.     # Build submenus
  660.     htmlReadMenuKeys
  661.     foreach me $htmlUtilSubMenus {
  662.         set [lindex $me 0]Menu [htmlBuildOneMenu $me]
  663.     }
  664.  
  665.     foreach me [lrange $htmlUtilSubMenus 1 end] {
  666.         lappend utilSubs [list menu -M HTML -p htmlMenuItem -m -n $me [set [lindex $me 0]Menu]]
  667.     }
  668.     
  669.     menu -M HTML -p htmlMenuItem -m \
  670.     -n $htmlUtilsMenu [concat [lrange  $UtilitiesMenu 0 3] "(-" \
  671.     $utilSubs "(-" [lrange $UtilitiesMenu 4 end]]
  672.     
  673.     set h {menu -M HTML -p htmlMenuItem -m -n $htmlUtilsMenu}
  674.     lappend h [concat [lrange  $UtilitiesMenu 0 3] "(-" \
  675.     $utilSubs "(-" [lrange $UtilitiesMenu 4 end]]
  676.     htmlSaveCache "HTML Utilities menu cache" $h
  677.     catch {unset htmlMenuKey}
  678. }
  679.  
  680. # Add some things to translation menu.
  681. proc htmlCharacterMenuExtra {} {
  682.     addMenuItem -m -l "" "Character Translation" "<>& -> HTML"
  683.     addMenuItem -m -l "" "Character Translation" "HTML -> <>&"
  684. }
  685.  
  686. # Check if Big Brother exists and if it should be used.
  687. proc htmlCheckMenuExtra {} {
  688.     global HTMLmodeVars modifiedModeVars
  689.     if {[catch {nameFromAppl Bbth}]} {
  690.         enableMenuItem "Check Links" "Use Big Brother" off
  691.         enableMenuItem "Check Links" "Check Remote Links" off
  692.         if {$HTMLmodeVars(useBigBrother)} {
  693.             set HTMLmodeVars(useBigBrother) 0
  694.             lappend modifiedModeVars {useBigBrother HTMLmodeVars}
  695.         }
  696.     } elseif {$HTMLmodeVars(useBigBrother)} {
  697.         markMenuItem -m {Check Links} {Use Big Brother} 1 
  698.     }
  699. }
  700.  
  701. # Disable URLs menu if cache is empty.
  702. proc htmlURLsMenuExtra {} {
  703.     global HTMLmodeVars
  704.     if {![llength $HTMLmodeVars(URLs)]} {htmlEnableURLs off}
  705. }
  706.  
  707. # Disable Windows menu if cache is empty.
  708. proc htmlWindowsMenuExtra {} {
  709.     global HTMLmodeVars
  710.     if {![llength $HTMLmodeVars(windows)]} {htmlEnablewindows off}
  711. }
  712.  
  713. # Mark and disable some stuff
  714. proc htmlUtilDisMark {} {
  715.     htmlMarkExtUtil
  716. }
  717.  
  718. proc htmlSetDis {} {
  719.     global HTMLmodeVars htmlDisabledItems htmlDisabledExtensions htmlDisabledDeprecated
  720.     global htmlHideDeprecated htmlHideExtensions htmlHideFrames
  721.     set htmlDisabledItems ""
  722.     if {$htmlHideDeprecated || $HTMLmodeVars(hideDeprecated)} {
  723.         set htmlDisabledItems $htmlDisabledDeprecated
  724.     } elseif {$htmlHideExtensions || $HTMLmodeVars(hideExtensions)} {
  725.         set htmlDisabledItems $htmlDisabledExtensions
  726.     }
  727.     if {$htmlHideDeprecated} {
  728.         lappend htmlDisabledItems "Frames/Frameset" "Frames/Frame" "Frames/Inline Frame" "Frames/No Frames"
  729.     } elseif {$htmlHideFrames} {
  730.         lappend htmlDisabledItems "Frames/Frameset" "Frames/Frame"
  731.     }
  732. }
  733.  
  734. set htmlDisabledExtensions [list "Blocks and Dividers/Multi Column" \
  735.   "Blocks and Dividers/Spacing" "Blocks and Dividers/No Line Break" "Blocks and Dividers/Word Break" \
  736.   "Styles/Marquee" "Styles/Blinking" "Links/Sound" "${htmlMenu}/Plug-ins" \
  737.   "Forms/Key Generator" "Java and JavaScript/Server" "${htmlMenu}/Layers"]
  738.  
  739. set htmlDisabledDeprecated $htmlDisabledExtensions
  740. lappend htmlDisabledDeprecated "Java and JavaScript/Applet" "Styles/Font" "Styles/Basefont" \
  741.   "Blocks and Dividers/Center" "Lists/Directory" "Lists/Menu" "Other/Isindex" \
  742.   "Styles/Strike out" "Styles/Underlined"
  743. htmlSetDis
  744.